package com.hc.jdbc.util;
/*
*
* Jdbc工具类 2.0 版本
* */

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
/*
 * 利用线程本地变量，存储连接对象，确保一个线程的多个方法可以获取同一个connection
 * 优势：事务操作的时候，service和dao属于同一个线程，不用再传递参数了，
 * 都可以调用getConnection自动获取相同的连接池。
 **/
public class JdbcUtilsV2 {
    //连接池对象
    private static DataSource dataSource = null;
    //线程本地变量
    private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
    static {
//初始化连接池对象
        Properties properties = new Properties();
        InputStream is =
                JdbcUtilsV2.class.getClassLoader().getResourceAsStream("druid.properties");
        try {properties.load(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        try {
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 对外提供获取连接的方法
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
//先判断本地变量中是否存在
        Connection connection = threadLocal.get();
        if(connection == null) {
//如果没有，则通过连接池获取
            connection = dataSource.getConnection();
            threadLocal.set(connection);
        }
        return connection;
    }
    /**
     * 回收连接的方法
     * @throws SQLException
     */
    public static void freeConnection() throws SQLException {
        Connection connection = threadLocal.get();
        if (connection != null) {
            threadLocal.remove();//清空线程本地变量数据
            connection.setAutoCommit(true);
            connection.close();//回收到连接池
        }
    }
}
